package com.wxg.sqlite.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

/**
 * Create at 2017年5月9日 by wxg
 * 一个用来存储sql语句的类,用法如下：
 * Sql sql = new Sql();
 * sql.add().add()...
 * 
 * (1) sql.line() 表示换行
 * (2) sql.str() 获取拼接之后的sql
 * (3) sql.human() 一定换行
 * (4) sql.add(" where ...") 自己控制空格(如where之前需要加空格,自己添加)
 * 
 * @author pactera
 *
 */
public class Sql {

	/**
	 * 容器：存储sql语句
	 */
	private List<String> list = null;

	/**
	 * 是否换行
	 */
	private boolean newline = false;

	/**
	 * 获取系统的换行符
	 */
	public static final String LINE_SEP = System.getProperty("line.separator");

	public Sql() {
//		if (null == list) {
//			list = new ArrayList<String>();
//		}
		// 上面是if判断是多余的!
		list = new ArrayList<String>();
	}

	/**
	 * 向容器中添加一行新的sql
	 * 
	 * @param str
	 * @return
	 */
	public Sql add(String str) {
		list.add(str);
		return this;
	}
	
	public Sql empty(String str) {
		if(null == str){
			add("null");
		}else if(StringUtils.isBlank(str)){
			add("'").heel("'");
		}else{
			add(str);
		}
		return this;
	}
	
	public Sql quotation(String str) {
		add("'").heel(str).heel("'");
		return this;
	}
	
	/**
	 * 在之前的行上添加内容
	 * 
	 * @param str
	 * @return
	 */
	public Sql heel(String str){
		int last = list.size() - 1;
		String lastStr = list.get(last);
		list.set(last, lastStr + str);
		return this;
	}

	public String str() {
		return getStr(isNewline());
	}

	/**
	 * 一定换行
	 * @return
	 */
	public String humman() {
		return getStr(true);
	}

	/**
	 * 私有方法
	 * @param flag
	 * @return
	 */
	private String getStr(boolean flag) {
		StringBuilder sbb = new StringBuilder();
		sbb.append(LINE_SEP);
		int size = list.size();
		for (int i = 0; i < size; i++) {
			sbb.append(list.get(i));
			if (flag && i < (size - 1)) {
				sbb.append(LINE_SEP);
			}
		}
		return sbb.toString();
	}

	@Override
	public String toString() {
		return str();
	}

	public Sql line() {
		this.newline = true;
		return this;
	}

	public boolean isNewline() {
		return newline;
	}

	public List<String> getList() {
		return list;
	}

	/**
	 * 输出到控制台
	 */
	public void print(){
		System.out.println( humman() );
	}
	
	
	
	public static void main(String[] args) {
		{
			Sql sql = new Sql();
//			sql.setNewline(true);
			sql.add("11");
			sql.add("22");
			System.out.println(sql.toString());
		}
		System.out.println("===");
		{
			Sql sql0 = new Sql();
			sql0.line().add("33").add("44");
			sql0.add("55");
			System.out.println(sql0.str());
			System.out.println(sql0.humman());
		}
		System.out.println("===");
		{
			Sql sql = new Sql();
			sql.add("aa");
			sql.add("bb");
			System.out.println(sql.str());
		}
	}
}
